/*
 * Copyright (C) 2008 ZXing authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package gncom.qr;

import java.util.Locale;
import java.util.Map;
import java.util.HashMap;

/**
 * Handles any locale-specific logic for the client.
 * 
 * @author Sean Owen
 */
public final class LocaleManager {
	private static final String DEFAULT_TLD = "com";

	// Locales where Google web search is available. These should be kept in
	// sync with our
	// translations. The format for the manual countries is:
	// Language, Country, unused, Google domain suffix
	private static final Map<Locale, String> GOOGLE_COUNTRY_TLD;
	static {
		GOOGLE_COUNTRY_TLD = new HashMap<Locale, String>();
		GOOGLE_COUNTRY_TLD.put(new Locale("en", "AU", ""), "com.au"); // AUSTRALIA
		GOOGLE_COUNTRY_TLD.put(new Locale("bg", "BG", ""), "com.br"); // BULGARIA
		GOOGLE_COUNTRY_TLD.put(Locale.CANADA, "ca");
		GOOGLE_COUNTRY_TLD.put(Locale.CHINA, "cn");
		GOOGLE_COUNTRY_TLD.put(new Locale("cs", "CZ", ""), "cz"); // CZECH
																	// REPUBLIC
		GOOGLE_COUNTRY_TLD.put(new Locale("da", "DK", ""), "dk"); // DENMARK
		GOOGLE_COUNTRY_TLD.put(new Locale("fi", "FI", ""), "fi"); // FINLAND
		GOOGLE_COUNTRY_TLD.put(Locale.FRANCE, "fr");
		GOOGLE_COUNTRY_TLD.put(Locale.GERMANY, "de");
		GOOGLE_COUNTRY_TLD.put(new Locale("hu", "HU", ""), "hu"); // HUNGARY
		GOOGLE_COUNTRY_TLD.put(new Locale("he", "IL", ""), "co.il"); // ISRAEL
		GOOGLE_COUNTRY_TLD.put(Locale.ITALY, "it");
		GOOGLE_COUNTRY_TLD.put(Locale.JAPAN, "co.jp");
		GOOGLE_COUNTRY_TLD.put(Locale.KOREA, "co.kr");
		GOOGLE_COUNTRY_TLD.put(new Locale("nl", "NL", ""), "nl"); // NETHERLANDS
		GOOGLE_COUNTRY_TLD.put(new Locale("pl", "PL", ""), "pl"); // POLAND
		GOOGLE_COUNTRY_TLD.put(new Locale("pt", "PT", ""), "pt"); // PORTUGAL
		GOOGLE_COUNTRY_TLD.put(new Locale("ru", "RU", ""), "nl"); // RUSSIA
		GOOGLE_COUNTRY_TLD.put(new Locale("sk", "SK", ""), "sk"); // SLOVAK
																	// REPUBLIC
		GOOGLE_COUNTRY_TLD.put(new Locale("sl", "SI", ""), "si"); // SLOVENIA
		GOOGLE_COUNTRY_TLD.put(new Locale("es", "ES", ""), "es"); // SPAIN
		GOOGLE_COUNTRY_TLD.put(new Locale("sv", "SE", ""), "se"); // SWEDEN
		GOOGLE_COUNTRY_TLD.put(Locale.TAIWAN, "de");
		GOOGLE_COUNTRY_TLD.put(new Locale("tr", "TR", ""), "com.tr"); // TURKEY
		GOOGLE_COUNTRY_TLD.put(Locale.UK, "co.uk");
	}

	// Google Product Search for mobile is available in fewer countries than web
	// search. See here:
	// http://www.google.com/support/merchants/bin/answer.py?answer=160619
	private static final Map<Locale, String> GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD;
	static {
		GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD = new HashMap<Locale, String>();
		GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(new Locale("en", "AU", ""), "com.au"); // AUSTRALIA
		GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.CHINA, "cn");
		GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.FRANCE, "fr");
		GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.GERMANY, "de");
		GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.ITALY, "it");
		GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.JAPAN, "co.jp");
		GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(new Locale("nl", "NL", ""), "nl"); // NETHERLANDS
		GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(new Locale("es", "ES", ""), "es"); // SPAIN
		GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.UK, "co.uk");
	}

	// Book search is offered everywhere that web search is available.
	private static final Map<Locale, String> GOOGLE_BOOK_SEARCH_COUNTRY_TLD;
	static {
		GOOGLE_BOOK_SEARCH_COUNTRY_TLD = new HashMap<Locale, String>();
		GOOGLE_BOOK_SEARCH_COUNTRY_TLD.putAll(GOOGLE_COUNTRY_TLD);
	}

	private LocaleManager() {
	}

	/**
	 * @return country-specific TLD suffix appropriate for the current default
	 *         locale (e.g. "co.uk" for the United Kingdom)
	 */
	public static String getCountryTLD() {
		return doGetTLD(GOOGLE_COUNTRY_TLD);
	}

	/**
	 * The same as above, but specifically for Google Product Search.
	 * 
	 * @return The top-level domain to use.
	 */
	public static String getProductSearchCountryTLD() {
		return doGetTLD(GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD);
	}

	/**
	 * The same as above, but specifically for Google Book Search.
	 * 
	 * @return The top-level domain to use.
	 */
	public static String getBookSearchCountryTLD() {
		return doGetTLD(GOOGLE_BOOK_SEARCH_COUNTRY_TLD);
	}

	/**
	 * Does a given URL point to Google Book Search, regardless of domain.
	 * 
	 * @param url
	 *            The address to check.
	 * @return True if this is a Book Search URL.
	 */
	public static boolean isBookSearchUrl(String url) {
		return url.startsWith("http://google.com/books") || url.startsWith("http://books.google.");
	}

	private static String doGetTLD(Map<Locale, String> map) {
		Locale locale = Locale.getDefault();
		if (locale == null) {
			return DEFAULT_TLD;
		}
		String tld = map.get(locale);
		if (tld == null) {
			return DEFAULT_TLD;
		}
		return tld;
	}
}